﻿using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;

namespace Yd.HttpHandler
{
    public static class init_rnd
    {
        public static Random rand = new Random(unchecked((int)DateTime.Now.Ticks));
        public static Random init()
        {
            rand = new Random(unchecked((int)DateTime.Now.Ticks));
            return rand;
        }
    }

    public static class RandomStr
    {
        public static string codeSerial = "a,b,c,d,e,f,g,h,j,k,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9";//这里添加你要随机产生的字符，当然你可以加些数字机去，我在这里只产生大写和小写字母。
        public static string codeSerialn = "0,1,2,3,4,5,6,7,8,9";//这里添加你要随机产生的字符，当然你可以加些数字机去，我在这里只产生大写和小写字母。
        public static string CreateRadNum(int codeLen, bool isonly_num)
        {
            int Length = 4;
            if (codeLen == 0)
            {
                codeLen = Length;
            }
            string[] arr;
            if (isonly_num == true)
            {
                arr = codeSerialn.Split(',');
            }
            else
            {
                arr = codeSerial.Split(',');
            }

            string code = "";
            int randValue = -1;
            for (int i = 0; i < codeLen; i++)
            {
                randValue = init_rnd.rand.Next(0, arr.Length - 1);
                code += arr[randValue];
            }
            return code;
        }

    }

    public class HandlerImage : IHttpHandler, IRequiresSessionState
    {

        public bool IsReusable
        {
            get { return true; }
        }

        void IHttpHandler.ProcessRequest(HttpContext context)
        {
            DrawImage(4, context);
        }

        protected void DrawImage(int code, HttpContext context)
        {
            init_rnd.init();
            string codeString = RandomStr.CreateRadNum(code, false);
            context.Session["CheckCodeb"] = codeString.Trim();
            CreateImage(codeString, context);
        }

        private void CreateImage(string checkCode, HttpContext content)
        {
            int iwidth = (int)(checkCode.Length * 15);
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
            Graphics g = Graphics.FromImage(image);
            g.Clear(Color.White);
            //定义颜色
            Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
            //定义字体            
            string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
            Random rand = new Random();
            //随机输出噪点
            //for (int i = 0; i < 50; i++)
            //{
            //    int x = rand.Next(image.Width);
            //    int y = rand.Next(image.Height);
            //    g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
            //}

            //输出不同字体和颜色的验证码字符
            for (int i = 0; i < checkCode.Length; i++)
            {
                int cindex = rand.Next(7);
                int findex = rand.Next(5);

                Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);
                Brush b = new System.Drawing.SolidBrush(c[cindex]);
                int ii = 4;
                if ((i + 1) % 2 == 0)
                {
                    ii = 2;
                }
                g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
            }
            //画一个边框
            g.DrawRectangle(new Pen(Color.LightGray, 0), 0, 0, image.Width - 1, image.Height - 1);

            //输出到浏览器
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            content.Response.ClearContent();
            content.Response.ContentType = "image/Jpeg";
            content.Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            image.Dispose();
        }
    }
}
